/****************************************************************************
 * Copyright (c) 2004 Composent, Inc. and others.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *    Composent, Inc. - initial API and implementation
 *
 * SPDX-License-Identifier: EPL-2.0
 *****************************************************************************/

package org.eclipse.ecf.presence;

import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.runtime.IAdapterManager;
import org.eclipse.ecf.internal.presence.PresencePlugin;

/**
 * Base presence class implementing {@link IPresence}. Subclasses may be
 * created as appropriate.
 * 
 */
public class Presence implements IPresence {

	private static final long serialVersionUID = 3906369346107618354L;

	protected Type type;

	protected Mode mode;

	protected String status;

	protected Map properties;

	protected byte[] pictureData;

	public Presence() {
		this(Type.AVAILABLE);
	}

	public Presence(Type type) {
		this(type, null, Mode.AVAILABLE);
	}

	public Presence(Type type, String status, Mode mode, Map props, byte[] picture) {
		this.type = (type == null) ? IPresence.Type.AVAILABLE : type;
		this.status = status;
		this.mode = (mode == null) ? IPresence.Mode.AVAILABLE : mode;
		this.properties = (props == null) ? new HashMap() : props;
		this.pictureData = (picture == null) ? new byte[0] : picture;
	}

	public Presence(Type type, String status, Mode mode, Map props) {
		this(type, status, mode, props, null);
	}

	public Presence(Type type, String status, Mode mode) {
		this(type, status, mode, null);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ecf.presence.roster.IPresence#getMode()
	 */
	public Mode getMode() {
		return mode;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ecf.presence.roster.IPresence#getProperties()
	 */
	public Map getProperties() {
		return properties;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ecf.presence.roster.IPresence#getStatus()
	 */
	public String getStatus() {
		return status;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ecf.presence.roster.IPresence#getType()
	 */
	public Type getType() {
		return type;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
	 */
	public Object getAdapter(Class adapter) {
		IAdapterManager adapterManager = PresencePlugin.getDefault().getAdapterManager();
		if (adapterManager == null)
			return null;
		return adapterManager.loadAdapter(this, adapter.getName());
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ecf.presence.IPresence#getPictureData()
	 */
	public byte[] getPictureData() {
		return pictureData;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	public String toString() {
		StringBuffer sb = new StringBuffer("Presence["); //$NON-NLS-1$
		sb.append("type=").append(type).append(";"); //$NON-NLS-1$ //$NON-NLS-2$
		sb.append("mode=").append(mode).append(";"); //$NON-NLS-1$ //$NON-NLS-2$
		sb.append("status=").append(status).append(";"); //$NON-NLS-1$ //$NON-NLS-2$
		sb.append("props=").append(properties).append(";"); //$NON-NLS-1$ //$NON-NLS-2$
		sb.append("picture=").append(pictureData).append("]"); //$NON-NLS-1$ //$NON-NLS-2$
		return sb.toString();
	}
}
